<#include "/macro.include"/>
<#assign className = table.className>   
<#assign classNameLower = className?uncap_first> 
/**
 * ${basepackage}.dao.${className}Dao.java
 */
package ${basepackage}.${classNameLower}.dao;

import java.util.List;
import java.util.HashMap;
import java.util.Map;

import com.foodbank.commons.dao.BaseDao;
import com.foodbank.commons.utils.BaseVO;
import com.foodbank.commons.utils.Page;
import com.foodbank.commons.utils.Utils;

import ${basepackage}.${classNameLower}.mapper.${className};

import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.annotations.Options;

/**
 * @file  ${className}Dao.java
 * @author ${author}
 * @version 0.1
 * @${className}数据操作类
 * Copyright(C), 2013-2014
 *		  Guangzhou Sunrise Technology Co., Ltd.
 * History
 *   	1. Date: ${dateTime}
 *      	Author: ${author}
 *      	Modification: this file was created
 *   	2. ...
 */
public class ${className}Dao extends BaseDao {	
    /**
     * 分页查询
     * @param sqlDef 预定义SQL名称, params params{属性名:属性值, currPage:当前页面数, pageSize:每页最大行数, orderBy:List<Map<属性名:升序或者降序>>, nopaging:boolean是否分页}
     * @return type : Page 返回一个分页的List，操作失败返回null
	 * @throws Exception
     */
	@SuppressWarnings("rawtypes")
	@Options(useCache = true ,flushCache=false)
	public Page queryForPage(String sqlDef, Map params) throws Exception {
		return queryForPage(sqlDef, params, null);
	}
	
    /**
     * 分页查询
     * @param params params{属性名:属性值, currPage:当前页面数, pageSize:每页最大行数, orderBy:List<Map<属性名:升序或者降序>>, nopaging:boolean是否分页}
     * @return type : Page 返回一个分页的List，操作失败返回null
	 * @throws Exception
     */
	@SuppressWarnings("rawtypes")
	@Options(useCache = true ,flushCache=false)
	public Page queryForPage(Map params) throws Exception {
		return queryForPage("${table.sqlName}.selectByParams", params, null);
	}
	
    /**
	 * 对数据库进行查询并返回一个VO列表
	 * @return type : List 返回查询操作所有符合条件的记录的VO对象集合，操作失败返回null
	 * @throws Exception
	 */
	@SuppressWarnings({ "rawtypes" })
	@Options(useCache = true ,flushCache=false)
	public List selectAll() throws Exception {
		return queryForList("${table.sqlName}.selectAll", null);
	}
	
	/**
     * 在本方法中组装出一个Map{[数据库列名:值],[数据库列名:值]}对象调用myBatis相关方法
	 * @param valueOne 需要进行查询的值。
	 * @param valueTwo 需要进行查询的值。
	 * @param valueThree 需要进行查询的值。
	 * @return type : List 返回查询操作所有符合条件的记录的VO对象集合，操作失败返回null
	 * @throws Exception
	 */
	@SuppressWarnings("rawtypes")
	@Options(useCache = true ,flushCache=false)
	public List selectByParamMap(Map paramMap) throws Exception {
	    return queryForList("${table.sqlName}.selectByParams", paramMap);
	}
	
	/**
	 * 搜索数据库中所有与对象对应的记录
	 * @param vo 对象对应到数据库中的一条记录
	 * @return type : List 返回查询操作所有符合条件的记录的VO对象集合，操作失败返回null
	 * @throws Exception
	 */
	@SuppressWarnings("rawtypes")
	@Options(useCache = true ,flushCache=false)
	public List selectByVo(${className} vo) throws Exception {
	    if(vo == null) return null;
	    return queryForList("${table.sqlName}.selectByVO", vo);
	}
    
    /**
     * 搜索数据库中与传入的主键对应的记录
     * @param pkid 与数据库主键对应
     * @return type : 返回查询操作所有符合条件的记录的VO对象集合，操作失败返回null
	 * @throws Exception
     */
	<#list table.columns as c>
	<#if c.pk>
	<#if c.sqlTypeName=='LONG'|| c.sqlTypeName=='INT' || c.sqlTypeName=='INTEGER' || c.sqlTypeName=='NUMBER'>
	@Options(useCache = true ,flushCache=false)
	public ${className} selectByPk(Long pkId) throws Exception {
    	if(pkId ==null) return null;
	<#else>
    @Options(useCache = true ,flushCache=false)
	public ${className} selectByPk(String pkId) throws Exception {
    	if(StringUtils.isEmpty(pkId)) return null;
	</#if>
	</#if>
	</#list>
    	return (${className})queryForObject("${table.sqlName}.selectByPk", pkId);
    }
    
	/**
	 * 向数据库中插入一个VO对象
	 * @param vo 对象对应到数据库中的一条记录
	 * @return type : 
	 * @throws Exception
	 */
	@Options(useCache = false ,flushCache=true)
	public ${className} insertByVo(${className} vo) throws Exception {
	    if(vo == null) return null;
	    return (${className})insert("${table.sqlName}.insertByVo", vo);
    }
	
    /**
	 * 更新数据库中对象对应的记录
	 * @param vo 对象对应到数据库中的一条记录记录
	 * @return type : 
	 * @throws Exception
	 */
	@Options(useCache = false ,flushCache=true)
	public ${className} updateByVo(${className} vo) throws Exception {
		if(vo == null) return null;
		update("${table.sqlName}.updateByVO", vo);
		return vo;
	}
	
    /**
	 * 更新数据库中对象对应的记录
	 * @param vo 对象对应到数据库中的一条记录记录
	 * @return type : 
	 * @throws Exception
	 */
	@Options(useCache = false ,flushCache=true)
	public ${className} updateByVoNotNull(${className} vo) throws Exception {
		if(vo == null) return null;
		update("${table.sqlName}.updateByVoNotNull", vo);
		return vo;
	}
	
    /**
	 * 更新数据库中对象的状态
	 * @param map: <ids: Id列表>, <status: 状态>, <modifier: 修改者>
	 * @return type : boolean 返回操作是否成功
	 * @throws Exception
	 */
	@Options(useCache = false ,flushCache=true)
	@SuppressWarnings("rawtypes")
    public boolean updateStatus(Map params) throws Exception {
    	if(params == null) return false;
    	getSqlSession().update("${table.sqlName}.updateStatus", params);
    	return true;
    }
	   
	/**
	 * 删除数据库中所有记录
	 * @return type : boolean 返回删除操作是否成功
	 * @throws Exception
	 */
	@Options(useCache = false ,flushCache=true)
	public boolean deleteAll() throws Exception {
		return delete("${table.sqlName}.deleteAll", null) > 0?true:false;
	}
	

	/**
	 * 删除数据库中与对象对应的记录
	 * @param vo 对象对应到数据库中的一条记录
	 * @return type : boolean 返回删除操作是否成功
	 * @throws Exception
	 */
	@Options(useCache = false ,flushCache=true)
	public boolean deleteByVo(${className} vo) throws Exception {
		if(vo == null) return false;
		int i = delete("${table.sqlName}.deleteByVO", vo);
		return i==0?false:true;
	}
	
    /**
	 * 删除数据库中与传入的主键对应的一条记录
	 * @param pkid 与数据库主键对应
	 * @return type : boolean 返回删除操作是否成功,如果传入参数为空则返回false,如果操作失败则抛出Exception异常
	 * @throws Exception
	 */
	<#list table.columns as c>
	<#if c.pk>
	<#if c.sqlTypeName=='LONG'|| c.sqlTypeName=='INT' || c.sqlTypeName=='INTEGER' || c.sqlTypeName=='NUMBER'>
	@Options(useCache = false ,flushCache=true)
    public boolean deleteByPk(Long pkId) throws Exception {
		if(pkId == null) return false;
	<#else>
	@Options(useCache = false ,flushCache=true)
    public boolean deleteByPk(String pkId) throws Exception {
		if(StringUtils.isEmpty(pkId)) return false;
	</#if>
	</#if>
	</#list>
		delete("${table.sqlName}.deleteByPk", pkId);
		return true;
	}
}
